<script>
   const arr = [
  { 'id': '29', 'pid': '',     'name': '总裁办' },
  { 'id': '2c', 'pid': '',     'name': '财务部' },
  { 'id': '2d', 'pid': '2c',   'name': '财务核算部'},
  { 'id': '2f', 'pid': '2c',   'name': '薪资管理部'},
  { 'id': 'd2', 'pid': '',     'name': '技术部'},
  { 'id': 'd3', 'pid': 'd2',   'name': 'Java研发部'}
]

function arrTree(arr,pid){
    // 先用filter找出pid为空的对象(根据需要找的pid决定,这里决定找到pid为''的)
  const tree =arr.filter(item=>item.pid === pid)
    // 然后再遍历pid为空对象
  tree.forEach(item=> {
    // 在函数中调用自己
    // 创建一个children,其值为 对象中id与刚刚用filter找出的对象的pid相同的对象
    // 对children的每一项继续找children
    item.children = arrTree(arr,item.id)
  });
    // 返回
  return tree
}
console.log(arrTree(arr, ''))
</script>